package chap_03_ThreadLocal;

/**
 * @Description ThreadLocal 学习：withInitial 初始化构造
 * @Author shihan
 * @Date 2022/11/5 10:36
 * @Version 1.0
 */
public class ThreadLocal_demo_01_withInitial {

    public static ThreadLocal<Integer> myThreadLocal = new ThreadLocal<>();
    public static ThreadLocal<Integer> myThreadLocalWithInitial = ThreadLocal.withInitial(() -> 100);

    /**
     * 1、如果不初始化赋值，线程在使用 ThreadLocal 对象进行第一次 get 时将会获取到 null
     * 2、withInitial 设置了一个 supplier 用来返回 get 为空时候的初始值，此时返回的是 ThreadLocal 子类 SuppliedThreadLocal
     * 2.1、此时只要 get 获取值时发现 ThreadLocalMap 中没有，则会将 supplier 的初始值先 set 进去并返回初始值
     * 2.2、实测下来发现，不仅仅是第一次 get 有效，remove 后的 get 依然有效，因为只要 get 为空，就会先进行初始化并返回初始化的值
     *
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "--> default " + myThreadLocal.get()); // null
                System.out.println(Thread.currentThread().getName() + "--> withInitial " + myThreadLocalWithInitial.get()); // 100
                myThreadLocalWithInitial.remove();
                System.out.println(Thread.currentThread().getName() + "--> withInitial after remove " + myThreadLocalWithInitial.get()); // 100
            }, String.valueOf(i)).start();
        }

    }

}
